package day28;
// 1)메뉴 아이템에 이벤트 핸들러 추가
// 2) String fileName = "nonname.txt"; -> 필드 추가
// 3) String ->byte[] 변환메서드 : getByte()
// 4) 저장하기 위한 절차
//   -textArea의 문자열을 Byte배열 변환      // String -> byte[] 변환메서드 : getBytes() 를 추가해야됨...
//   -FileOutPutStrema 생성
//   -Write(byte[])저장.
//   -프로젝트 폴더의 루트에 파일이 저장됨.
// 5)프레임타이틀창에 현재 편집되고 있는 파일명 표시
// 6)상태표시줄에 현재 작업상태에 따른 메시지 출력(읽음, 저장함, 다른 이름으로 저장 등등)


import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

import java.awt.BorderLayout;

import javax.swing.JScrollPane;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;



public class TextEditor extends JFrame {
	
		String fileName = "noname.txt";  // 클래스 안에 필드 추가 
	private	JLabel lblNewLabel = new JLabel("상태표시줄");
	private	JScrollPane scrollPane = new JScrollPane();
	private JPanel contentPane;
	private JTextArea textArea = new JTextArea(); // 처음에 3d로 디자인에서 만들면 행동을 해야 하는 지역에 대한 변수가 밑 부분에 생성이 되므로 공용적으로 사용하기 위해 위로 끌어 올렸다.
	
	
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TextEditor frame = new TextEditor();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TextEditor() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		
		JMenuBar menuBar = new JMenuBar();
		menuBar.setToolTipText("");
		setJMenuBar(menuBar);
		
		JMenu mnFile = new JMenu("File");
		menuBar.add(mnFile);
		
		JMenuItem menuItem = new JMenuItem("읽기");
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				FileInputStream fis = null;
				InputStreamReader isr= null;
				
				BufferedReader br=null;
				
				int data;
				try{
					fis = new FileInputStream(fileName);
					isr= new InputStreamReader(fis);
					br= new BufferedReader(isr);
					
					textArea.setText("");
					while(true){
						String str = br.readLine();
						if(str == null) break;
						textArea.append(str + "\n");
						
					}
					br.close();
					isr.close();
					fis.close();
					}catch(Exception ex){
					ex.printStackTrace();
				}
				}
				
				
				
			
		});
		mnFile.add(menuItem);
		
		JMenuItem mntmNewMenuItem = new JMenuItem("저장");
		mntmNewMenuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				saveFile();
				lblNewLabel.setText("저장이 되었습니다.");//JLabel lblNewLabel = new JLabel("상태표시줄"); 의 lblNewLabel 을 앞에 쓰고 setText로 붙여 출력 을 하는데 쓴다 set이 출력이다 get 불러오는거고... 헷갈.-ㅅ-;;
			}
		});
		mnFile.add(mntmNewMenuItem);
		
		JMenuItem mntmNewMenuItem_1 = new JMenuItem("다른이름 저장");
		mntmNewMenuItem_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser jc = new JFileChooser(fileName);     //  | 
				int yn = jc.showSaveDialog(TextEditor.this);      //  |   이 부분은 다 외워야 할 부분이다..// 이 부분까지 창이 보여지는 부분이다. 
				if(yn == JFileChooser.APPROVE_OPTION){            //  |
						fileName = jc.getSelectedFile().getPath(); //fileName = jc.getSelectedFile().getPath();
						saveFile();
						lblNewLabel.setText("다른이름으로 저장이되었습니다."); // 
						}
				
			}
		});
		mnFile.add(mntmNewMenuItem_1);
		
		JMenuItem mntmQnf = new JMenuItem("불러오기");
		mntmQnf.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			JFileChooser jc =new JFileChooser(fileName);
			int yn = jc.showOpenDialog(TextEditor.this);
			if(yn !=JFileChooser.APPROVE_OPTION)	return; // APPROVE_OPTION 기존에 저장된 파일을 열라는 명령어.... 라서 대문자로 씀
			fileName = jc.getSelectedFile().getPath();//
			
			setTitle(fileName); // 메뉴 표시줄에 불러오게 되는 경로가 보이게 된다 
			
			
			
			}
		});
		mnFile.add(mntmQnf);
		
		JMenuItem menuItem_1 = new JMenuItem("종료");
		mnFile.add(menuItem_1);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		
		
//		lblNewLabel
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		
		scrollPane.setViewportView(textArea);
		
		
		contentPane.add(lblNewLabel, BorderLayout.SOUTH);
	}
	
	public void saveFile() {   // 요놈의 savaFile이란 메서드 라서 위에다가 아래에다가 써도 된다라고 함
		String str = textArea.getText();//  -  |
		//	byte[] b = str.getBytes();//         -  |   String -> Byte 로바꾼다
			
			FileOutputStream fos = null;
			OutputStreamWriter osw =null;
			BufferedWriter bw= null; // bw 란 BufferWriter 란 약자........... 오늘 처음암.. 다른사람들과 다 같이 사용을 한다면 모든 사람들이 내가 사용한 변수라는 것을 알리기 위해 지정하는기다.
			try{
				fos = new FileOutputStream(fileName);
				osw = new OutputStreamWriter(fos);
				bw = new BufferedWriter(osw);
				
				
				bw.write(textArea.getText());
				
				
				bw.close(); // close는 열린 순서로 써주기, 실행이 되면 닫는다.
				osw.close(); //실행이 되면 닫는다.
				fos.close();  // --> 저장하기 누르기 전에 저장이 된다 ,실행이 되면 닫는다.
			}catch(Exception ex){   //에러를 만들어야 하는 문구 
				ex.printStackTrace();    
			}
	}
}
